<?php
/*

Представление (одиночка)

Берет на входе $registry
Из него получает имя текущего модуля,
html модуля,
html каждого виджета.

Вставляет все это в глобальный шаблон, зависящий от имени модуля.

Возвращает html.

*/
 // rename controllerInterface to BasicInt
class View extends controllerInterface implements BasicViewInterface {
    
    static public $instance;
    
    protected $registry;
    protected $smarty;
    protected $tpl;
    public $modul; // объект модуля // [?] зачем
    public $modul_index;
    public $modul_class_name;
    
    
    private function __construct($registry = null){
    
        $this->smarty = new Smarty(); 

        $this->smarty->template_dir = SITE . '/templates/';
        $this->smarty->compile_dir = SITE . '/cache/smarty';
        $this->smarty->config_dir = SITE . '/config/';
        $this->smarty->cache_dir = SITE . '/cache/';  
    
        if(isset($modul_class_name) AND $modul_class_name != false AND $modul_class_name != ''){
        // вывести модуль
            $this->modul_class_name = $modul_class_name;
            
            // тест
            $this->modul = new $modul_class_name;
            // где создавать объект, если нужно сразу вызвать заданный метод?
            // где уничтожать объект?
            // ,,
            // где хранить методы fetch, Set, getUriArg?
            // ..
            // где вызывать главный шаблон и передавать в него результат выполнения модуля?
            
        } else {
        //
        }
        
        //
        $this->registry = $registry;
        
    
    } // -- __construct
    
    static function getInstance(){
    
        if( !isset(self::$instance) ){
            $className = __CLASS__; 
            self::$instance = new $className;
        }
        return self::$instance;
    
    } // -- getInstance
    
   
    
   
    /*
    function loadMethod($method){//?
    //
        return eval("return \$this->modul->".$method."();");
       // return eval("return \$this->".$MD."();");
    
    } // -- loadMethod
     */
    function fetch($tpl){
    // вернуть шаблон в переменную
        
        $html = $this->smarty->fetch($tpl);
        
        return $html;
    } // -- fetch()
    
    function show($tpl){
    // вывести шаблон   
        
        $this->smarty->display($tpl);
        
    } // -- show()
    
    function Get($tpl){
    // returns an Output (html) to put it into var (brutal fetching)
    
        ob_start();
        $this->smarty->display($tpl);        
        $html = ob_get_clean();
        return $html;
    } // -- Get()
  
    function Set($tpl_var, $var){  
      $i = self::getInstance();
      //die( var_dump($i) );
    
    
    // interface for assign()
        $this->smarty->assign($tpl_var, $var); 
        
    } // -- Set()
         
    
       function GetHtml($tpl){
    // returns an Output to put it into var (brutal html-templates fetching)
    // [input] Full path OR filename which will be prefixed by "document_root/templates/"
    
        preg_match("/\//", $tpl, $matches);
        if(isset($matches))
          if(isset($matches[0])) {}
        else $tpl = SITE."/templates/$tpl";     
    
        ob_start();        
        require_once $tpl;
        $html = ob_get_clean();
        
        return $html;    
    } // -- GetHtml()
    
    function __set($name, $var){
        $this->$name = $var;
        //$this->smarty->$name = $var;
        //$this->smarty->assign($name, $var);
        $this->Set($name,$var); //так отваливается в модулях [?]
    }
    
    
    function render($tpl = null){
      
        // узнать глобальный шаблон для текущего модуля (из реестра?)
        $tpl = $this->tpl;
        
        // взять код виджетов (из реестра?)
        
        // срендерить конечную страницу

        if( (bool)$tpl === false AND (bool)$this->tpl === false ){
            $tpl = 'index.tpl';
            ///fb('Шаблн не найден. Использован аварийный режим вывода.');
        }

        $this->html = $this->fetch($tpl);
    }
    
    function output(){
        return $this->html;
    } // --
    
    
}

interface BasicViewInterface {
      

      function render($tpl = null);
} // --

class BasicModulView extends View  {
// Дополнительный класс-прослойка, от которого наследуются представления модулей

    public $basic_tpl; // основной шаблон модуля
    public $view; // 
    public $modul_id; //
    public $widgets_to_render;

    public $smo;  // local smarty object

    function __construct(){
        
        $this->modul_index = Registry::getInstance()->get('modul_index');
    
        
        $this->smo = new SmartyBC();

        $this->smo->template_dir = PUBLIC_PATH . "/Moduls/$this->modul_index";
        $this->smo->compile_dir = PUBLIC_PATH . '/cache/smarty/';
        $this->smo->config_dir = PUBLIC_PATH . '/config/';
        $this->smo->cache_dir = PUBLIC_PATH . '/cache/';


        $this->view = View::getInstance();
        $this->basic_tpl = ''; //TODO get tpl
        $this->modul_id =  Registry::getInstance()-> get('modul_id') ;
    } // --

    function getView(){
    // Get global View
        return $this->view;
    }
    
    function show($tpl){
    // вывести шаблон   
        
        $this->smo->display($tpl);
        
    } // -- show()
    
    function Get($tpl){
    // returns an Output (html) to put it into var (brutal fetching)
    
        ob_start();
        $this->smo->display($tpl);        
        $html = ob_get_clean();
        return $html; 
    } // -- Get()
  
    function Set($tpl_var, $var){  
         //$i = self::getInstance();


    
    // interface for assign()
        $this->smo->assign($tpl_var, $var); 
        
    } // -- Set()
    
    function fetch($tpl){
      // вернуть шаблон в переменную
          
          $html = $this->smo->fetch($tpl);
          
          return $html;
      } // -- fetch()
    
    function render($tpl = null){  
       
        if($tpl == null)      
          $this->html = $this->fetch($this->basic_tpl);
        else
          $this->html = $this->fetch($tpl);
    }

    // Виджеты
    function addWidget($name, $input_data = null){
        $input_data['modul_id'] = $this->modul_id;

        if(!is_array($this->widgets_to_render)){
            //$widget = array($name, $input_data);
            $input_data['name'] = $name;
            $this->widgets_to_render[] = $input_data;
        } else {
            if( !$this->searchWidget($name) ){
                $input_data['name'] = $name;
                $this->widgets_to_render[] = $input_data;
            }
        }
    }

    function searchWidget($name){
        foreach($this->widgets_to_render as $k => $widget){
            if(isset($widget['name'])){
                if($widget['name'] == $name) return true;
            }
        }
        return false;
    }

    function renderLocalWidgets(){
        if(is_array($this->widgets_to_render)){
            foreach($this->widgets_to_render as $k => $widget){
                $this->view->MenuLocal_widget = Registry::getInstance() -> get('Widget') -> renderGivenLocalWidget($widget['name'], null, $widget);
            }
        }
    }

} // --














?>